<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    


    <script>
        // var p = new Promise(function(){})
        // p 实例化后的对象  
        // Promise 实例对象 有 then 方法   then方法是定义在原型对象 (prototype)
        // p.then(callback1,callback2) 作用是为 Promise 实例添加状态改变时候的回调 
        // 当Promise 实例的状态 由 pedding(进行中) 改为 fulfilled(已成功) 则执行回调 callback1
        // 当Promise 实例的状态 由 pedding(进行中) 改为 rejected(已成功) 则执行回调  callback2

        // callback1  callback2 都是一个形式参数  p.then(success,failed)  接收Promise实例里面返回的数据
        // callback1 可接收 resolve 
        // callback2 错误回调  可接收 reject  以抛错的形式传递数据
        // callback2  接收 Promise 代码执行的语法错误  a = 100 ; key:key 
        
        // 总结 Promise 是异步编程  没有改变异步的本质  而是通过封装回调resolve reject  把代码给修改的更像同步函数
        
        
        // var p = new Promise(function(resolve,reject){
        //     setTimeout(()=>{
        //         var num = Math.random();
        //         // hellow 
        //         if(num > 0.5){
        //             resolve(true)  //callback1
        //         }else{
        //             reject(false)  //callback2
        //         } 
        //         console.log(p)
        //     },3000)
        // })
        
        // // then 同步写好  提前为 Promise实例添加状态改变时候的回调函数 提前决定了成功和失败回调的代码内容 最终还是要看 promise 返回的结果(resolve or reject)

        // // 如果成功了 我要干嘛 
        // // 如果失败了 我要干嘛

        // p.then(function(result){
        //     console.log("遵守承诺,准时下课", result)
        // },(error)=>{
        //     console.log("违背承诺--一直拖堂", error)
        // })

        // promise 有语法错误 会跳出 Promise 逻辑判断直接 进入 reject 失败回调 
        // var p = new Promise(function(resolve,reject){
        //     helloyou   // 语法错误
        //     setTimeout(()=>{
        //         var num = Math.random();
        //         console.log(num)
        //         if(num > 0.5){
        //             resolve(true)  //callback1
        //         }else{
        //             reject(false)  //callback2
        //         } 
        //         console.log(p)
        //     },3000)
        // })


        // catch 
        // Promise.prototype.catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名，
        // 用于指定发生错误时的回调函数
        // callback2 错误回调  可接收 reject  以抛错的形式传递数据
        // callback2  接收 Promise 代码执行的语法错误  a = 100 ; key:key 

        var p = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                var num = Math.random()
                var num = 0.9;
                if(num>0.5){
                    resolve(true)
                }else{
                    reject(false)
                }
                console.log(p)
            })
        })

        // p.then(result=>{
        // },error=>{
        // })

        // p.then(undefined,function(error){
        //     console.log("违背承诺--一直拖堂",error)
        // })
            
        // 用于指定发生错误时的回调函数 直接捕捉异常 
        // p.catch((error)=>{
        //     console.log("2107")
        //     console.log("违背承诺--一直拖堂",error)
        // })

        // p.then(result=>{
        // },error=>{
        // })
            
        // 链式操作  
        // str.replace().replace().replace().replace().replace().replace()
        p.then(function(result){   // 指定成功的回调函数 resolve 
            hello;
            console.log("遵守承诺,准时下课", result)
        }).catch(function(error){  // 指定失败的回调函数 reject 
            console.log("违背承诺--一直拖堂",error)
        })
        
        // var promise
        // // bad
        // promise
        // .then(function(data) {
        //     // success
        // }, function(err) {
        //     // error
        // });

        // // good
        // promise
        // .then(function(data) { //cb
        //     // success
        // })
        // .catch(function(err) {
        //     // error
        // });

        // 上面代码中，第二种写法要好于第一种写法，
        // 理由是第二种写法可以捕获前面then方法执行中的错误，也更接近同步的写法（try/catch）。
        // 因此，建议总是使用catch()方法，而不使用then()方法的第二个参数
    </script>
</body>
</html>